package com.mossle.user.service; import java.io.ByteArrayOutputStream; import javax.activation.DataSource; import javax.annotation.Resource; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.core.store.ByteArrayDataSource; import com.mossle.user.ImageUtils; import com.mossle.user.avatar.AvatarCache; import com.mossle.user.persistence.domain.AccountAvatar; import com.mossle.user.persistence.domain.AccountInfo; import com.mossle.user.persistence.manager.AccountAvatarManager; import com.mossle.user.persistence.manager.AccountInfoManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(rollbackFor = Exception.class) public class UserAvatarService { private static Logger logger = LoggerFactory .getLogger(UserAvatarService.class); private AccountInfoManager accountInfoManager; private AccountAvatarManager accountAvatarManager; private StoreConnector storeConnector; private AvatarCache avatarCache; public DataSource viewAvatarById(Long accountId, int width, String tenantId) throws Exception { if (accountId == null) { logger.info("accountId cannot be null"); return null; } String key = "accountId:" + accountId + ":" + width; String userId = Long.toString(accountId); DataSource dataSource = this.avatarCache.getDataSource(userId, width); if (dataSource != null) { return dataSource; } AccountInfo accountInfo = accountInfoManager.get(accountId); dataSource = this.viewAvatarByAccountInfo(accountInfo, width, tenantId); this.avatarCache.updateDataSource(userId, width, dataSource); return dataSource; } public DataSource viewAvatarByUsername(String username, int width, String tenantId) throws Exception { // String key = "username:" + username + ":" + width; AccountInfo accountInfo = accountInfoManager.findUniqueBy("username", username); String userId = Long.toString(accountInfo.getId()); DataSource dataSource = this.avatarCache.getDataSource(userId, width); if (dataSource != null) { return dataSource; } dataSource = this.viewAvatarByAccountInfo(accountInfo, width, tenantId); this.avatarCache.updateDataSource(userId, width, dataSource); return dataSource; } public DataSource viewAvatarByAccountInfo(AccountInfo accountInfo, int width, String tenantId) throws Exception { String key = null; if (accountInfo != null) { String hql = "from AccountAvatar where accountInfo=? and type='default'"; AccountAvatar accountAvatar = accountAvatarManager.findUnique(hql, accountInfo); if (accountAvatar != null) { key = accountAvatar.getCode(); } } if (key == null) { key = "default.jpg"; } StoreDTO storeDto = null; storeDto = storeConnector.getStore("avatar", key, tenantId); if (storeDto == null) { storeDto = storeConnector.getStore("avatar", "default.jpg", tenantId); return storeDto.getDataSource(); } if (width == 0) { return storeDto.getDataSource(); } StoreDTO originalStoreDto = storeDto; int index = key.lastIndexOf("."); String prefix = key.substring(0, index); String suffix = key.substring(index); String resizeKey = prefix + "-" + width + suffix; StoreDTO resizeStoreDto = storeConnector.getStore("avatar", resizeKey, tenantId); if (resizeStoreDto == null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageUtils.zoomImage(originalStoreDto.getDataSource() .getInputStream(), baos, width, width); logger.info("resizeKey : {}", resizeKey); resizeStoreDto = storeConnector.saveStore("avatar", resizeKey, new ByteArrayDataSource(storeDto.getDataSource().getName(), baos.toByteArray()), tenantId); } return resizeStoreDto.getDataSource(); } @Resource public void setAccountInfoManager(AccountInfoManager accountInfoManager) { this.accountInfoManager = accountInfoManager; } @Resource public void setAccountAvatarManager( AccountAvatarManager accountAvatarManager) { this.accountAvatarManager = accountAvatarManager; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } @Resource public void setAvatarCache(AvatarCache avatarCache) { this.avatarCache = avatarCache; } }